package xdu.lz.stage2_design_pattern.chapter7_future_pattern;

import java.util.function.Consumer;

public class FutureService<T> {


    //线程调用submit后，submit又会去创建一个线程来阻塞等待结果的获取。但是调用submit的线程可以立即返回
    public Future<T> submit (final FutureTask<T> task){

        //把Future和FutureTask桥接起来

        AsynFuture<T> asynFuture = new AsynFuture<>();
        //先创一个线程，负责阻塞等待调用结果
        new Thread(()->{
            //task.call是一个接口任务，由用户定义，执行完毕后会把结果传递给done然后通知get
            T result = task.call();
            asynFuture.done(result);
        }).start();
        return asynFuture;
    }


    //把结果放入一个回调函数中
    public Future<T> submit (final FutureTask<T> task, final Consumer<T> consumer){
        AsynFuture<T> asynFuture = new AsynFuture<>();
        //先创一个线程，负责阻塞等待调用结果
        new Thread(()->{
            //task.call是一个接口任务，由用户定义
            T result = task.call();
            asynFuture.done(result);
            //把结果放入consumer中，进行回调
            consumer.accept(result);
        }).start();
        return asynFuture;
    }

}
